package main

import (
	"context"
	"fmt"
	"time"
)

func isCancelled(ctx context.Context) bool {
	select {
	// <-ctx.Done() 表示接收到了取消的通知信号,此时所有的子Context都会被取消
	case <-ctx.Done():
		return true
	default:
		return false
	}
}

func main() {
	// 通过 context.Background() 创建一个 根Context
	// 通过 context.WithCancel(根Context) 创建子Context, 返回一个用于触发撤销信号的函数
	ctx, cancel := context.WithCancel(context.Background())
	for i := 0; i < 5; i++ {
		go func(i int, ctx context.Context) {
			for {
				if isCancelled(ctx) {
					break
				}
				time.Sleep(time.Millisecond * 5)
			}
			fmt.Println("任务", i, "已取消")
		}(i, ctx)
	}

	//调用 触发撤销信号的函数
	cancel()
	time.Sleep(time.Second * 1)
}
